package com.yingxin.yx.framework.mybatisplus.generator;

import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * @author fanchao
 */
public class CodeGenerator {

    public static void main(String[] args) {

        String outputDir = "D:/codes";
        String url = "jdbc:mysql://192.168.2.205:3306/20250314?serverTimezone=Hongkong&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false";
        String username = "root";
        String password = "root12321";

        CodeConfig codeConfig = new CodeConfig();
        codeConfig.setAuthor("yuebao");

        // 表名 表前缀
        codeConfig.setTableName("t_contact_units_factory_flow");
        codeConfig.setTablePrefix("");

        // TODO 1 moduleName package2 package3 这三个对应 yxerp-module-X-X-X
        codeConfig.setModuleName("contact");
        codeConfig.setPackage2("units");
        // codeConfig.setPackage3("log");

        // 普通类    CodeConfig.NORMAL;
        // 单据类    CodeConfig.BILL;
        codeConfig.setBuildType(CodeConfig.NORMAL);

        // TODO 2 普通类设置
        // 参数为：类对象名
        // codeConfig.setEntityVariable("bill");

        // TODO 3 单据类设置
        // 明细表指向单据表的关联字段，一般为 bill_id
        //codeConfig.setForeignKey("bill_id");
        // 参数为：单据类名，单据对象名
       // codeConfig.setBillClass("MaterialTransfer", "bill");
        // 参数为：明细类名，明细对象名
        //codeConfig.setItemClass("MaterialTransferItem", "item");

        // build
        build(outputDir, url, username, password, codeConfig);
    }


    public static void build(String outputDir, String url, String username, String password, CodeConfig codeConfig) {
        switch (codeConfig.getBuildType()) {
            case CodeConfig.NORMAL:
                exec(outputDir, url, username, password, codeConfig);
                break;
            case CodeConfig.BILL:
                // 生成单据
                exec(outputDir, url, username, password, codeConfig);
                // 生成明细
                codeConfig.setBuildType(CodeConfig.ITEM);
                codeConfig.setTableName(codeConfig.getTableName() + "_item");
                exec(outputDir, url, username, password, codeConfig);
                break;
        }
    }


    public static void exec(String outputDir, String url, String username, String password, CodeConfig codeConfig) {
        if (StringUtils.isEmpty(codeConfig.getModuleName())) {
            System.out.println("没有 moduleName");
            return;
        }
        if (StringUtils.isEmpty(codeConfig.getTableName())) {
            System.out.println("没有 tableName");
            return;
        }
        // 代码生成器
        AutoGenerator autoGenerator = new AutoGenerator();
        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        //String projectPath = System.getProperty("user.dir");
        //gc.setOutputDir(projectPath + "c:/codes/src/main/java");
        gc.setOutputDir(outputDir);
        gc.setAuthor(codeConfig.getAuthor());
        gc.setOpen(false);
        gc.setBaseColumnList(true);
        autoGenerator.setGlobalConfig(gc);
        // 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl(url);
        // dsc.setSchemaName("public");
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUsername(username);
        dsc.setPassword(password);
        autoGenerator.setDataSource(dsc);
        // 包配置
        PackageConfig pc = new PackageConfig();
        // pc.setModuleName(scanner("模块名"));
        pc.setModuleName(codeConfig.getModuleName());

		/*-------------------------------------
		|                修改包                |
		=======================================*/

        pc.setParent("com.yingxin.yxerp.module");

        autoGenerator.setPackageInfo(pc);
        // 自定义配置
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
                // to do nothing
            }
        };
        List<FileOutConfig> focList = new ArrayList<>();
        // "/templates/Mapper.xml.ftl"
        focList.add(new FileOutConfig("ftl/Mapper.xml.ftl") {
            @Override
            public String outputFile(com.baomidou.mybatisplus.generator.config.po.TableInfo tableInfo) {
                // 自定义输入文件名称
                /*
                return "c:/codes/src/main/resources/mapper/" + pc.getModuleName() + "/"
                        + tableInfo.getEntityName() + "Mapper.xml";
                */
                String moduleName = pc.getModuleName();
                if (StringUtils.isNotEmpty(codeConfig.getPackage2())) {
                    moduleName = moduleName + "\\" + codeConfig.getPackage2();
                }
                if (StringUtils.isNotEmpty(codeConfig.getPackage3())) {
                    moduleName = moduleName + "\\" + codeConfig.getPackage3();
                }

                return "c:/codes/src/main/java/com/yingxin/yxerp/module/" + moduleName + "/mapper/mysql/"
                        + tableInfo.getEntityName() + "Mapper.xml";
            }
        });
        cfg.setFileOutConfigList(focList);
        autoGenerator.setCfg(cfg);
        autoGenerator.setTemplate(new TemplateConfig().setXml(null));

        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        // 下划线转驼峰命名
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        // 是否为lombok模型
        strategy.setEntityLombokModel(true);
        // 生成 @RestController 控制器
        strategy.setRestControllerStyle(true);
        // 自定义继承的Controller类全称，带包名
        //strategy.setSuperControllerClass("com.yingxin.yx.admin.core.controller.BaseController");
        // 自定义继承的Entity类全称，带包名
        //strategy.setSuperEntityClass("com.yingxin.yx.admin.core.entity.BaseEntity");
        // 自定义基础的Entity类，公共字段
        //strategy.setSuperEntityColumns("id");
        // 驼峰转连字符
        strategy.setControllerMappingHyphenStyle(true);

		/*-------------------------------------
		|             修改表前缀                |
		=======================================*/
        // 表前缀
        strategy.setTablePrefix(codeConfig.getTablePrefix());

        // strategy.setInclude(scanner("表名"));
        strategy.setInclude(codeConfig.getTableName());
        autoGenerator.setStrategy(strategy);
        // FreemarkerTemplate
        FreemarkerTemplateEnginePlus engine = new FreemarkerTemplateEnginePlus();
        engine.setCodeConfig(codeConfig);
        autoGenerator.setTemplateEngine(engine);
        autoGenerator.execute();
    }

}
